From b32859ae6a513ff21a7d3a4e48a6016e2afe25e3 Mon Sep 17 00:00:00 2001 From: robertl Date: Sun, 30 Apr 2006 18:58:18 +0000 Subject: [PATCH] Improve the reliability of the libusb module. A) eliminate reset - this avoids a race between us and the host OS stack discovering devices. B) Call full device close when doing device discovery to drain stray bulk/intr request packets. --- gpsbabel/jeeps/gpslibusb.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/gpsbabel/jeeps/gpslibusb.c b/gpsbabel/jeeps/gpslibusb.c index 879d2b7c3..8890092b0 100644 --- a/gpsbabel/jeeps/gpslibusb.c +++ b/gpsbabel/jeeps/gpslibusb.c @@ -115,21 +115,11 @@ garmin_usb_start(struct usb_device *dev) int i; if (udev) return; - /* - * Linux _requires_ the reset. OSX doesn't work if we - * DO reset it. I really should study this more, but for - * now, we'll just avoid the reset on Apple's OSX. - */ -#if !defined (__APPLE__) - udev = usb_open(dev); - usb_reset(udev); - usb_close(udev); -#endif /* APPLE */ udev = usb_open(dev); atexit((void(*)())gusb_teardown); - if (!udev) { fatal("usb_open failed\n"); } + if (!udev) { fatal("usb_open failed: %s\n", usb_strerror()); } /* * Hrmph. No iManufacturer or iProduct headers.... */ @@ -194,7 +184,13 @@ void garmin_usb_scan(libusb_unit_data *lud, int req_unit_number) continue; if (req_unit_number < 0) { garmin_usb_start(dev); - gusb_teardown(NULL); + /* + * It's important to call _close + * here since the bulk/intr models + * may have a "dangling" packet that + * needs to be drained. + */ + gusb_close(NULL); } else if (req_unit_number == found_devices) garmin_usb_start(dev); -- 2.30.2